﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

namespace Neto.Web;

/// <summary>
///     上传配置
/// </summary>
public class WebUploadConfig
{
    /// <summary>
    ///     构造函数：初始化AbcUploadConfig对象
    /// </summary>
    /// <param name="category">文件分类</param>
    /// <param name="allowExtensions">允许的文件扩展名列表，默认为空。如果传入null，则会初始化为空列表</param>
    /// <param name="maxFileSize">最大文件大小，默认为10MB</param>
    /// <param name="datetimeFloderType">上传文件时，文件夹的日期格式类型，默认为年月文件夹</param>
    public WebUploadConfig(string category, List<string> allowExtensions, int maxFileSize = 10,
        WebUploadDatetimeFloderType datetimeFloderType = WebUploadDatetimeFloderType.年月文件夹)
    {
        Category = category; // 设置文件分类

        AllowExtensions = allowExtensions ?? new List<string>(); // 设置允许的文件扩展名列表，如果传入null，则初始化为空列表
        MaxFileSize = maxFileSize; // 设置最大文件大小
        DatetimeFloderType = datetimeFloderType; // 设置日期格式化的文件夹类型
    }

    /// <summary>
    ///     文件验证
    /// </summary>
    [System.Text.Json.Serialization.JsonIgnore]
    [Newtonsoft.Json.JsonIgnore]
    public Func<WebUploadConfig, WebUploadResult, IFormFile, bool>? FileVer { get; set; }

    /// <summary>
    ///     使用默认的文件头验证
    /// </summary>
    public bool IsDefaultFileHeadValid { get; set; } = true;

    /// <summary>
    ///     是否存在静态目录(需要配合 UploadFloder使用)
    /// </summary>
    public bool IsWwwroot { get; set; }

    /// <summary>
    ///     根路径(包含upload节点)，如果为空，则默认使用系统配置文件的根路径
    ///     例如：D:\Upload\
    /// </summary>
    public string UploadFloder { get; set; }

    /// <summary>
    ///     是否原图压缩
    /// </summary>
    public bool IsOriginalImageCompression { get; set; } = false;

    /// <summary>
    ///     原图压缩率，整数，1~100
    /// </summary>
    public int OriginalImageCompressionRatio { get; set; } = 80;

    /// <summary>
    ///     原图压缩的图片扩展名集合，设置了的扩展才会压缩
    ///     默认：.jpg,.png,.jpeg,.jif,.bmp,.webp
    /// </summary>
    public List<string> OriginalImageCompressionExtension { get; set; } =
        [".jpg", ".png", ".jpeg", ".jif", ".bmp", ".webp"];

    /// <summary>
    ///     是否生成图片缩略图
    /// </summary>
    public bool IsImgThumbnail { get; set; } = true;

    /// <summary>
    ///     图片缩略图宽度，高度按比例计算
    /// </summary>
    public int ImgThumbnailWith { get; set; } = 100;

    /// <summary>
    ///     图片生成缩略图扩展名集合，在集合中的扩展名才会生成缩略图
    /// </summary>
    public List<string> ImgThumbnailExtension { get; set; } = [".jpg", ".png", ".jpeg", ".jif", ".bmp", ".webp"];

    /// <summary>
    ///     最大文件大小(单位：MB)
    /// </summary>
    public int MaxFileSize { get; set; } = 10;

    /// <summary>
    ///     相对文件夹路径
    ///     例如：files\\2023\\01\\01\\
    ///     例如：journal\logo
    /// </summary>
    public string RelFileFloder { get; set; } = "files";

    // /// <summary>
    // /// 是否改变扩展名，在文件末尾添加扩展名
    // /// </summary>
    // public bool IsChangeExtensionName { get; set; }
    //
    // /// <summary>
    // /// 改变的扩展名，默认为null，不改变
    // /// </summary>
    // public string ChangeExtensionName { get; set; }

    // /// <summary>
    // /// 是否验证图片
    // /// </summary>
    // public bool IsVerImage { get; set; }
    //
    // /// <summary>
    // /// 验证图片的扩展名，只有设置的扩展名才能验证，且IsVerImage=true，才会生效
    // /// </summary>
    // public List<string> VerImageExtensions { get; set; } = [".jpg", ".png", ".jpeg", ".jif", ".bmp", ".webp"];

    /// <summary>
    ///     自定义文件名
    /// </summary>
    public string CustomerFileName { get; set; }

    /// <summary>
    ///     日期文件夹类型（默认无日期文件夹，0无日期文件夹，1年文件夹，2年月文件夹，3年月日文件夹）
    /// </summary>
    public WebUploadDatetimeFloderType DatetimeFloderType { get; set; } = WebUploadDatetimeFloderType.无日期文件夹;


    /// <summary>
    ///     相对路由地址,默认 /f/{文件fid}
    ///     例如：/upload/files/
    /// </summary>
    public string RelRoutUrl { get; set; } = "f";

    /// <summary>
    ///     不验证文件头，默认都是要验证的，所以不验证的都在这里
    /// </summary>
    public List<string> NoVerFileHeaderExtensions { get; set; } = [];

    #region IFormFile

    // /// <summary>
    // /// 用于存储IFormFile类型的列表。
    // /// </summary>
    // public List<IFormFile> Files { get; set; } = [];
    //
    // /// <summary>
    // /// 添加一个IFormFile到列表中。
    // /// </summary>
    // /// <param name="file">要添加的IFormFile实例。</param>
    // public void SetIFormFile(IFormFile file)
    // {
    //     files.Add(file);
    // }
    //
    // /// <summary>
    // /// 向列表中添加一组IFormFile。
    // /// </summary>
    // /// <param name="files">要添加的IFormFile实例列表。</param>
    // public void SetIFormFile(List<IFormFile> files)
    // {
    //     // 将传入的文件列表添加到当前实例的文件列表中
    //     files.AddRange(files);
    // }

    #endregion

    #region 必须

    /// <summary>
    ///     文件上传类别【不作为生成文件路径或名称使用】
    /// </summary>
    public string Category { get; set; }

    /// <summary>
    ///     允许上传的文件扩展名
    /// </summary>
    public List<string> AllowExtensions { get; set; } = [];

    #endregion
}